有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何避免这种ClassCastException?

我有一个带有Nimbus l&;的Swing应用程序;f。有时我会遇到这个异常,但我不知道它是在哪里触发的,也不知道如何避免它,因为所有源都来自跟踪堆栈中的Java库类。这是Java问题还是我的问题

关于我的系统的一些信息:

avaVersion=1.8.0_20

osName=Linux

osVersion=3.15.10-201。fc20。x86_64

异常消息:

java.lang.ClassCastException: java.awt.Font cannot be cast to javax.swing.Painter
        javax.swing.plaf.nimbus.NimbusStyle.getBackgroundPainter(NimbusStyle.java:708)
        javax.swing.plaf.nimbus.SynthPainterImpl.paintBackground(SynthPainterImpl.java:99)
        javax.swing.plaf.nimbus.SynthPainterImpl.paintPanelBackground(SynthPainterImpl.java:957)
        javax.swing.plaf.synth.SynthPanelUI.update(SynthPanelUI.java:154)
        javax.swing.JComponent.paintComponent(JComponent.java:777)
        javax.swing.JComponent.paint(JComponent.java:1053)
        javax.swing.JComponent.paintToOffscreen(JComponent.java:5223)
        javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:290)
        javax.swing.RepaintManager.paint(RepaintManager.java:1265)
        javax.swing.JComponent._paintImmediately(JComponent.java:5171)
        javax.swing.JComponent.paintImmediately(JComponent.java:4982)
        javax.swing.RepaintManager$4.run(RepaintManager.java:824)
        javax.swing.RepaintManager$4.run(RepaintManager.java:807)
        java.security.AccessController.doPrivileged(Native Method)
        java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
        javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:807)
        javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:782)
        javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:731)
        javax.swing.RepaintManager.access$1300(RepaintManager.java:64)
        javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1720)
        java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
        java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
        java.awt.EventQueue.access$400(EventQueue.java:97)
        java.awt.EventQueue$3.run(EventQueue.java:697)
        java.awt.EventQueue$3.run(EventQueue.java:691)
        java.security.AccessController.doPrivileged(Native Method)
        java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
        java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
        java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
        java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
        java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
        java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
        java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
java.awt.Font cannot be cast to javax.swing.Painter

编辑:

如果这是一致性的,而且经常发生,我也许能弄明白

显然,我也不可能尝试向画家投射字体

EDIT2:

这里复制了完整的异常堆栈

EDIT3

应用程序GUI部分在SwingUtilities中启动。invokeAndWait()

我以前也经常使用我的Win7机器,但从未在Win7上使用过。此应用程序已存在1年


共 (1) 个答案

  1. # 1 楼答案

    Swing GUI会引发间歇性异常,这表明这是一个并发/线程问题。你正在启动Swing event dispatch thread上的GUI吗?如果没有,请务必这样做,尤其是一些外观和;感觉像光环一样。换句话说,在一个可运行的队列中创建GUI,并使用SwingUtilities.invokeLater(...)将其添加到Swing事件队列中

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            // create your Swing GUI and set the L&F here
        });
    }
    

    如果这不是问题所在,那么仍然可以寻找其他Swing线程问题,可能使用here引用的方法之一


    关于同一问题,请参见this bug report。它被作为“非问题”关闭,因为:

    This is most definitely a multithreading issue.

    再一次,我现在可以自信地说,你的问题是线程问题,解决这个问题的方法是检查你的代码,找出你的代码在哪里违反了Swing的线程规则,因为最肯定的是,它确实违反了Swing的线程规则。如果您需要我们的帮助,那么您必须向我们展示您的相关代码,即可能违反Swing线程规则的代码。如果您不显示代码,我们无法提供具体帮助